#ifndef __FOC_H__
#define __FOC_H__

#include "app_main.h"

//有很多ARM写的快速数学公式
#include "arm_math.h" 
#include <math.h>

// 定义FOC算法所需的常数
#define M_PI (3.14159265358f)         // 圆周率
#define M_2PI (6.28318530716f)        // 2倍圆周率
#define SQRT3 (1.73205080757f)        // 3的平方根
#define SQRT3_BY_2 (0.86602540378f)   // 3的平方根的一半    
#define ONE_BY_SQRT3 (0.57735026919f) // 1除以3的平方根
#define TWO_BY_SQRT3 (1.15470053838f) // 2除以3的平方根
//定义FOC算法所需的简单运算
#define square(x) ((x) * (x))               // 求平方
#define abs(x) ((x) >= 0 ? (x) : -(x))      // 求绝对值
#define min(x, y) (((x) < (y)) ? (x) : (y)) // 取较小值
#define max(x, y) (((x) > (y)) ? (x) : (y)) // 取较大值

typedef struct
{
    // 角度
    float theta;
    // 此角度对应的正弦值
    float sin_val;
    // 此角度对应的余弦值
    float cos_val;
    //=================================电机三相占空比==================================
    // A 相 PWM 占空比
    float T_deltaA;
    // B 相 PWM 占空比
    float T_deltaB;
    // C 相 PWM 占空比
    float T_deltaC;
    //===============================电机三相静止坐标系=================================
    // A相电流
    float i_a;
    // B相电流
    float i_b;
    // C相电流
    float i_c;
    // 总线电流
    float i_bus;
    // A相电压
    float v_a;
    // B相电压
    float v_b;
    // C相电压
    float v_c;
    // 总线电压
    float v_bus;
    //=================================两相静止坐标系==================================
    // Alpha 坐标系电流
    float i_alpha;
    // Alpha 坐标系电压
    float v_alpha;
    // Beta 坐标系电流
    float i_beta;
    // Beta 坐标系电压
    float v_beta;
    //=================================两相静止坐标系==================================
    // D 坐标系电流
    float i_d;
    // D 坐标系电压
    float v_d;
    // Q 坐标系电流
    float i_q;
    // Q 坐标系电压
    float v_q;
} stFOC_Para_type;

void Motor_FOC_calcAll(stFOC_Para_type *FOC_Para);

#endif